<?php
/**
 * 模型测试组件
 *
 * @author KenXu
 * @date: 2010-7-28 下午02:58:49
 */
class Kenxu_Unit_Framework {
	/**
	 * 测试用例 运行类对象
	 * @var Kenxu_Unit_Runner
	 */
	private static $_runner = null ;
	
	/**
	 * 配置选项
	 * @var array
	 */
	private static $_config = null ;
	
	/**
	 * 测试结果集
	 * @var array
	 */
	private static $_resultset = null ;
	
	/**
	 * 初始化 单元测试资源
	 */
	static function init(array $config){
		self::$_runner = new Kenxu_Unit_Runner();
		// 解析设置数组
		$must = array('classes') ;
		foreach ($must as $opt) {
			if (!isset($config[$opt]))
				throw new Exception(
					sprintf("%s::%s(array) 参数数组设置错误,必设选项[%s]",__FILE__,__METHOD__,implode(',',$must))
				);
		}
		self::$_config = $config ;
		self::$_resultset = array();
	}
	
	/**
	 * 打印 测试报表
	 */
	static function report(){
		header('Content-Type: text/html; charset=utf-8');
		Kenxu_Core::dump(self::$_resultset,'测试结果');
	}	
	
	/**
	 * 运行 测试用例对象
	 */
	static function run(){
		// 使用内部的错误处理机制
//		function __kenxu_unit_errorHandle($errno, $errstr, $errfile, $errline){
//			echo "$errstr <br/>" ;
//		}
//		set_error_handler('__kenxu_unit_errorHandle') ;
		
		self::$_config['classes'] = array_unique(self::$_config['classes']) ;
		foreach (self::$_config['classes'] as $testcaseClass) {
			try {
				$testcase = @Kenxu_Core::getSingleton($testcaseClass) ;
				// 如果 加载的类中存在语法错误,此处也不会提示,需要手动捕捉
//				var_dump(error_get_last());
			} catch (Exception $e) {
				
				self::$_resultset[] = array(
					'class' => $testcaseClass ,'message' => $e->getMessage());
				continue ;
			}
			
			if ($testcase instanceof Kenxu_Unit_TestCase){
				self::$_resultset[] = self::$_runner->execute($testcase) ;
			}
			else {
				self::$_resultset[] = array(
					'class' => $testcaseClass ,
					'message' => "{$testcaseClass} not a Kenxu_Unit_TestCase instance" ,
				);
			}
		}
		
		// 恢复外部的错误处理机制
//		restore_error_handler();
	}
}
